import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/storage'
import router from "@/router";

// create an axios instance
const service = axios.create({
  // if u mock don't set this line
  baseURL: 'http://118.89.234.135:8089/WisdomGameAdmin',
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 // request timeout
});

// request interceptor
service.interceptors.request.use(
  config => {
    // do something before request is sent

    if (store.getters.token) {
      config.headers['Authorization'] = getToken()
    }
    return config
  },
  error => {
    // do something with request error
    console.log(error); // for debug
    return Promise.reject(error)
  }
);

// response interceptor
service.interceptors.response.use(
  /**
   * If you want to get http information such as headers or status
   * Please return  response => response
   */

  /**
   * Determine the request status by custom code
   * Here is just an example
   * You can also judge the status by HTTP Status Code
   */
  response => {
    const { status } = response;
    const res = response.data;
    // console.log(res)

    if (res.code === "00000") {
      return Promise.resolve(res);
    } else {
      let message = '';
      switch (res.code) {
        case "11111":// OK 服务器成功返回用户请求的数据，该操作是幂等的（Idempotent）
          message = res.code + res.emsg;
          break;
        case "11006":// OK 服务器成功返回用户请求的数据，该操作是幂等的（Idempotent）
          message = res.code + res.emsg;
          break;
        case 201:// CREATED - [POST/PUT/PATCH] 用户新建或修改数据成功
          break;
        case 202:// Accepted - [*] 表示一个请求已经进入后台排队（异步任务）
          break;
        default:
          break;
      }
      Message({
        message,
        type: 'error',
        duration: 5 * 1000
      });
      return Promise.reject(res);
    }

  },
  error => {
    // console.log('err:' + JSON.stringify(error.response.status)); // for debug
    // console.log(error)
    let message = '';
    let {status, data} = error.response;
    // let {  data } = error.response;
    // console.error(data['error']);
    switch (status) {
      case 400://  INVALID REQUEST - [POST/PUT/PATCH]：用户发出的请求有错误，服务器没有进行新建或修改数据的操作，该操作是幂等的。
        message = '发出的请求有错误'
        break;
      case 401:// Unauthorized - [*]：表示用户没有权限（令牌、用户名、密码错误）。
        message = '未授权请重新登录' 
        store.dispatch('user/logout').then(() => router.push('/login'));

        break;
      case 403:// Forbidden - [*] 表示用户得到授权（与401错误相对），但是访问是被禁止的。
        message = '服务器拒绝访问'
        break;
      case 404:// NOT FOUND - [*]：用户发出的请求针对的是不存在的记录，服务器没有进行操作，该操作是幂等的。
        message = '资源未找到' 
        break;
      case 406:// Not Acceptable - [GET]：用户请求的格式不可得（比如用户请求JSON格式，但是只有XML格式）。
        message = '请求格式错误' 
        break;
      case 410://  Gone -[GET]：用户请求的资源被永久删除，且不会再得到的。
        message = '资源已被永久删除' 
        break;
      case 422:// Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时，发生一个验证错误。
        message = '参数验证错误' 
        break;
      case 500://  INTERNAL SERVER ERROR - [*]：服务器发生错误，用户将无法判断发出的请求是否成功。
        message = '服务器内部错误'
        break;
      default:
        message = '未知错误';
    }
    Message({
      message,
      type: 'error',
      duration: 5 * 1000
    });
    return Promise.reject(error)
  }
);

export default service